#!/sbin/runscript
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/files/postgresql.init-8.4-r1,v 1.2 2010/07/11 11:53:55 patrick Exp $

opts="${opts} reload"

depend() {
    use net
    if [ -L /etc/eselect/postgresql/service ] ; then 
	local p_service="$(for f in /etc/eselect/postgresql/service/* ; do . $f ; done ; echo $postgres_service )"
	test "${p_service}" = "${SVCNAME}" && provide postgresql
    fi
}

checkconfig() {
    if [ ! -d "$PGDATA" ] ; then
	eerror "Directory not found: $PGDATA"
	eerror "Please make sure that PGDATA points to the right path."
	eerror "You can run 'emerge postgresql-server --config' to setup a new database cluster."
	return 1
    fi
}

start() {
    checkconfig || return 1

    ebegin "Starting PostgreSQL"

    if [ -f "$PGDATA/postmaster.pid" ] ; then
	rm -f "$PGDATA/postmaster.pid"
    fi

    local retval

    su -l ${PGUSER} \
	-c "env PGDATA=\"${PGDATA}\" PGPORT=\"${PGPORT}\" ${PG_EXTRA_ENV} /usr/lib/postgresql-8.4/bin/pg_ctl start ${WAIT_FOR_START} -t ${START_TIMEOUT} -s -o '--silent-mode=true ${PGOPTS}'"
    retval=$?

    if [[ $retval != 0 ]] ; then
	eend $retval
	return $retval
    fi

    # The following is to catch the case of an already running server
    # in which pg_ctl doesn't know to which server it connected to and
    # falsely reports the server as 'up'
    sleep 2
    if [ ! -f "$PGDATA/postmaster.pid" ] ; then
	eerror "The PID file doesn't exist but pg_ctl reported a running server."
	eerror "Please check whether there is another server running on the same port or read the log-file."
	eend 1
	return 1
    fi

    local pid=$(grep "^[0-9]\+" "$PGDATA/postmaster.pid")
    ps -p "${pid}" &> /dev/null
    eend $?
}

stop() {
    ebegin "Stopping PostgreSQL (this can take up to $(( ${NICE_TIMEOUT} + ${RUDE_TIMEOUT} + ${FORCE_TIMEOUT} )) seconds)"

    local retval

    if [[ "${NICE_QUIT}" != "NO" ]] ; then
	su -l ${PGUSER} \
	    -c "env PGDATA=\"${PGDATA}\" PGPORT=\"${PGPORT}\" ${PG_EXTRA_ENV} /usr/lib/postgresql-8.4/bin/pg_ctl stop ${WAIT_FOR_STOP} -t ${NICE_TIMEOUT} -s -m smart"
	retval=$?

	if [[ $retval == 0 ]] ; then
	    eend $retval
	    return $retval
	fi
	
	ewarn "Shutting down the server gracefully failed."
	ewarn "Probably because some clients did not disconnect within ${NICE_TIMEOUT} seconds."
    else
	ewarn "NICE_QUIT disabled."
	ewarn "You really should have it enabled."
    fi

    if [[ "${RUDE_QUIT}" != "NO" ]] ; then
	ewarn "RUDE_QUIT enabled."
	ewarn "Going to shutdown the server anyway."

	su -l ${PGUSER} \
	    -c "env PGDATA=\"${PGDATA}\" PGPORT=\"${PGPORT}\" ${PG_EXTRA_ENV} /usr/lib/postgresql-8.4/bin/pg_ctl stop ${WAIT_FOR_STOP} -t ${RUDE_TIMEOUT} -s -m fast"
	retval=$?

	if [[ $retval == 0 ]] ; then
	    eend $retval
	    return $retval
	fi

	eerror "Failed to shutdown server."
    else
	ewarn "RUDE_QUIT disabled."
    fi

    if [[ "${FORCE_QUIT}" == "YES" ]] ; then
	ewarn "FORCE_QUIT enabled."
	ewarn "Forcing server to shutdown."
	ewarn "A recover-run will be executed on the next startup."

	su -l ${PGUSER} \
	    -c "env PGDATA=\"${PGDATA}\" PGPORT=\"${PGPORT}\" ${PG_EXTRA_ENV} /usr/lib/postgresql-8.4/bin/pg_ctl stop ${WAIT_FOR_STOP} -t ${FORCE_TIMEOUT} -s -m immediate"

	retval=$?

	if [[ $retval == 0 ]] ; then
	    ewarn "Server forced down."
	    eend $retval
	    return $retval
	fi

	eerror "Forced shutdown failed!!!"
	eerror "Something is wrong with your system."
	eerror "Please take care of it manually."
	eerror "Unable to stop server."
	eend $retval
	return $retval
    else
	ewarn "FORCE_QUIT disabled."
	eerror "Unable to shutdown server."
	eend 1
	return 1
    fi
}

reload() {
    ebegin "Reloading PostgreSQL configuration"
    su -l ${PGUSER} \
	-c "env PGDATA=\"${PGDATA}\" PGPORT=\"${PGPORT}\" ${PG_EXTRA_ENV} /usr/lib/postgresql-8.4/bin/pg_ctl reload -s"
    eend $?
}
